package org.dlow.config;

import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @EnableConsumerRpc - 启用RPC客户端功能
 * 
 * <p>该注解用于在SpringBoot应用的启动类上,启用RPC客户端功能。
 * 通过@Import导入ConsumerConfig配置类,自动配置RPC客户端所需的组件。
 * 
 * <h3>核心功能:</h3>
 * <ul>
 *   <li>自动导入ConsumerConfig配置类</li>
 *   <li>注册ConsumerPostProcessor后置处理器</li>
 *   <li>初始化客户端相关组件(代理工厂、负载均衡器、注册中心客户端等)</li>
 *   <li>启动Netty客户端,用于与服务端通信</li>
 * </ul>
 * 
 * <h3>使用示例:</h3>
 * <pre>
 * &#64;SpringBootApplication
 * &#64;EnableConsumerRpc  // 添加此注解启用RPC客户端
 * public class ConsumerApplication {
 *     public static void main(String[] args) {
 *         SpringApplication.run(ConsumerApplication.class, args);
 *     }
 * }
 * </pre>
 * 
 * <h3>工作原理:</h3>
 * <ol>
 *   <li>SpringBoot启动时解析@EnableConsumerRpc注解</li>
 *   <li>通过@Import导入ConsumerConfig配置类</li>
 *   <li>ConsumerConfig创建并注册ConsumerPostProcessor到Spring容器</li>
 *   <li>ConsumerPostProcessor作为BeanPostProcessor,会处理所有Bean</li>
 *   <li>发现带有@RpcReference注解的字段,自动生成代理对象并注入</li>
 *   <li>同时启动Netty客户端,准备接收服务端响应</li>
 * </ol>
 * 
 * <h3>配置要求:</h3>
 * <p>需要在application.yml中配置RPC相关参数:
 * <pre>
 * rpc:
 *   port: 9091              # 客户端监听端口
 *   serialization: jdk      # 序列化方式
 *   proxy: cglib            # 代理方式
 *   registry:
 *     name: zookeeper       # 注册中心类型
 *     address: 127.0.0.1:2181  # 注册中心地址
 * </pre>
 * 
 * @description: 启用RPC客户端功能的注解
 * @Author: 山沐与山
 * @CreateTime: 2024-05-17 14:55
 * @see ConsumerConfig 客户端配置类
 * @see ConsumerPostProcessor 客户端后置处理器
 * @see RpcReference 服务引用注解
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import(ConsumerConfig.class)
public @interface EnableConsumerRpc {
}
